#ifndef _STM32F4XX_GPIO_H
#define _STM32F4XX_GPIO_H

#include "stm32f4xx.h" // Device header

#define GPIO_Pin_0         ((uint16_t)( 1 << 0))
#define GPIO_Pin_1         ((uint16_t)( 1 << 1))
#define GPIO_Pin_2         ((uint16_t)( 1 << 2))
#define GPIO_Pin_3         ((uint16_t)( 1 << 3))
#define GPIO_Pin_4         ((uint16_t)( 1 << 4))
#define GPIO_Pin_5         ((uint16_t)( 1 << 5))
#define GPIO_Pin_6         ((uint16_t)( 1 << 6))
#define GPIO_Pin_7         ((uint16_t)( 1 << 7))
#define GPIO_Pin_8         ((uint16_t)( 1 << 8))
#define GPIO_Pin_9         ((uint16_t)( 1 << 9))
#define GPIO_Pin_10        ((uint16_t)( 1 << 10))
#define GPIO_Pin_11        ((uint16_t)( 1 << 11))
#define GPIO_Pin_12        ((uint16_t)( 1 << 12))
#define GPIO_Pin_13        ((uint16_t)( 1 << 13))
#define GPIO_Pin_14        ((uint16_t)( 1 << 14))
#define GPIO_Pin_15        ((uint16_t)( 1 << 15))
#define GPIO_Pin_All       ((uint16_t)(0xFF))

/* GPIO模式 */
typedef enum
{
	GPIO_Mode_In  = 0,        /* 输入     */
	GPIO_Mode_Out = 1,        /* 通用输出 */
	GPIO_Mode_AF  = 2,        /* 复用     */
	GPIO_Mode_AN  = 3,        /* 模拟模式 */
}GPIOMode_TypeDef;

/* 上下拉配置 */
typedef enum
{
    GPIO_PuPd_NOPULL = 0,     /* 浮空 */
    GPIO_PuPd_UP     = 1,     /* 上拉 */
    GPIO_PuPd_DOWN   = 2,     /* 下拉 */
}GPIOPuPd_TypeDef;

/* 输出模式 */
typedef enum
{
    GPIO_OType_PP    = 0,     /* 推挽输出 */
    GPIO_OType_OD    = 1,     /* 开漏输出 */
}GPIOOType_TypeDef;

/* IO口翻转速度 */
typedef enum
{
    GPIO_Speed_2MHz  = 0,
    GPIO_Speed_25MHz = 1,
    GPIO_Speed_50MHz = 2,
    GPIO_Speed_100MHz= 3, 
}GPIOSpeed_TypeDef;

/* GPIO 初始化结构体 */
typedef struct
{
    uint16_t GPIO_Pin;
	GPIOMode_TypeDef  GPIO_Mode;
	GPIOPuPd_TypeDef  GPIO_PuPd;
	GPIOOType_TypeDef GPIO_OType;
	GPIOSpeed_TypeDef GPIO_Speed;
}GPIO_InitTypedef;

extern void GPIO_Init(GPIO_TypeDef *GPIOx, const GPIO_InitTypedef *GPIO_InitStruct);
extern void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
extern void GPIO_ResetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

#endif /* _STM32F4XX_GPIO_H */
